#include <vector>

#include "Conjunto.h"

Conjunto::Conjunto(int x, int y, int w, int h) : Primitiva(x,y)
{
    width = w;
    height = h;
}

Conjunto::Conjunto(const Conjunto& c) : Primitiva(c.GetX(),c.GetY())
{
    for(int i = 0; i < (signed)c.componentes.size(); i++)
    {
        Punto* p_subclass = dynamic_cast<Punto*>( c.componentes[i] );
        Linea* l_subclass = dynamic_cast<Linea*>( c.componentes[i] );
        Rectangulo* r_subclass = dynamic_cast<Rectangulo*>( c.componentes[i] );
        Triangulo* t_subclass = dynamic_cast<Triangulo*>( c.componentes[i] );
        Circulo* c_subclass = dynamic_cast<Circulo*>( c.componentes[i] );
        Conjunto* cj_subclass = dynamic_cast<Conjunto*>( c.componentes[i] );

        if(p_subclass)
        {
            componentes.push_back(new Punto(*p_subclass));
        }
        else if(l_subclass)
        {
            componentes.push_back(new Linea(*l_subclass));
        }
        else if(r_subclass)
        {
            componentes.push_back(new Rectangulo(*r_subclass));
        }
        else if(t_subclass)
        {
            componentes.push_back(new Triangulo(*t_subclass));
        }
        else if(c_subclass)
        {
            componentes.push_back(new Circulo(*c_subclass));
        }
        else if(cj_subclass)
        {
            componentes.push_back(new Conjunto(*cj_subclass));
        }
    }

    width = c.GetWidth();
    height = c.GetHeight();
}

Conjunto::Conjunto(const vector<Primitiva*>& v)
{
    for(int i = 0; i < (signed)v.size(); i++)
    {
        componentes.push_back(v[i]);
    }
}

void
Conjunto::Move(int x, int y)
{
    Primitiva::Move(x,y);
    for(int i = 0; i < (signed)componentes.size(); i++)
    {
        componentes[i]->Move(x,y);
    }
}

void
Conjunto::Agrupar(Primitiva* p)
{
    componentes.push_back(p);
}

void
Conjunto::Agrupar(vector<Primitiva*> p)
{
    for(vector<Primitiva*>::iterator it = p.begin(); it != p.end(); it++)
    {
        componentes.push_back(*it);
    }
}

void
Conjunto::Desagrupar(Primitiva* p)
{
    for(vector<Primitiva*>::iterator it = componentes.begin(); it != componentes.end();it++)
    {
        if((*it) == p)
            componentes.erase(it);
    }
}

/*
 * copia todas figuras del conjunto al vector de figuras facilitado como parámetro
 * */
void
Conjunto::Desagrupar(vector<Primitiva*>& figuras)
{
    for(int i = 0; i < (signed) componentes.size(); i++)
    {
        figuras.push_back(componentes[i]);
    }
    componentes.clear();
}